<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>14、Promise对象——应用</title>
	</head>
	<body>
		<script type="text/javascript">
			//十、应用
			//1.加载图片
			//我们可以将图片的加载写成一个Promise，一旦加载完成，Promise的状态就发生变化。
			const preloadImage = function(path){
				return new Promise(function(resolve,reject){
					const image = new Image();
					image.onload = resolve;
					image.onerror = reject;
					image.src = path;
				})
			}
			
			//2.Generator函数与Promise的结合
			//使用 Generator 函数管理流程，遇到异步操作的时候，通常返回一个Promise对象。
			function getFoo(){
				return new Promise(function(resolve,reject){
					resolve('foo');
				})
			}
			const g = function*(){
				try{
					const foo = yield getFoo();
					console.log(foo);
				}catch(e){
					console.log(e);
				}
			};
			
			function run (generator){
				const it = generator();
				function go(result){
					if(result.done)
					return result.value;
					
					return result.value.then(function(value){
						return go(it.next(value));
					},function(error){
						return go(it.throw(error))
					})
				}
				go(it.next())
			}
			run(g);  //foo
			//上面代码的 Generator 函数g之中，有一个异步操作getFoo，它返回的就是一个Promise对象。函数run用来处理这个Promise对象，并调用下一个next方法。
			
		</script>
	</body>
</html>
